#include "Tensor.h"


Tensor::Tensor(int size)
{
	x=size;
	y=size;
	z=size;
	for(int i = 0; i < size; i++)
	{
		vector<vector<double>> temp;
		theTensor.push_back(temp);
		for(int j=0; j<size; j++)
		{
			vector<double> temp;
			theTensor[i].push_back(temp);
			for(int k=0; k<size;k++)
			{
				theTensor[i][j].push_back(0);
			}
		}
	}
}

Tensor::Tensor(int xx,int yy,int zz)
{
	x=xx;
	y=yy;
	z=zz;
	for(int i = 0; i < x; i++)
	{
		for(int j=0; j<y; j++)
		{
			for(int k=0; k<z;k++)
			{
				theTensor[i][j].push_back(0);
			}
		}
	}
}

	bool Tensor::setElement(int xx,int yy,int zz,double value)
	{
		if(xx>=x) return false;
		if(yy>=y) return false;
		if(zz>=z) return false;
		theTensor[xx][yy][zz] = value;
		return true;
	}

	MatrixObject Tensor::matricification(int mode)
	{
				if(mode == 1)
				{
					MatrixObject result(x,y*z);
					for(int i = 0; i < x; i++)
					{
						for(int j=0; j < y; j++)
						{
							for(int k=0; k < z; k++)
							{
								result.setElement(i,j*z+k,theTensor[i][j][k]);
							}
						}
					}
					return result;
		}
		else if(mode == 2)
		{
			MatrixObject result(y,x*z);
			for(int i = 0; i < x; i++)
			{
				for(int j=0; j < y; j++)
				{
					for(int k=0; k < z; k++)
					{
						result.setElement(j,k*x+i,theTensor[i][j][k]);
					}
				}
			}
					return result;
		}
		else if(mode ==3)
		{
			MatrixObject result(z,y*x);
			for(int i = 0; i < x; i++)
			{
				for(int j=0; j < y; j++)
				{
					for(int k=0; k < z; k++)
					{
						result.setElement(k,i*y+j,theTensor[i][j][k]);
					}
				}
			}
					return result;
		}


		{
			MatrixObject empty(0,0);
			empty.matrixFailure = true;
			return empty;
		}
	}

